#ifndef PRIORITYQUEUE_H
#define PRIORITYQUEUE_H

#include <string>

namespace algo {
  static int custom_count;
  static int custom_count1;
  template<typename T>
  class PriorityQueueNode {
  public:
    virtual T getKey() const = 0;
  };

  template<typename T>
  class PriorityQueue {
  public:
    PriorityQueue(const std::string &name) : name(name) {}

    virtual PriorityQueueNode<T> *getMin() const = 0;
    virtual PriorityQueueNode<T> *insert(T key) = 0;

    virtual void decreaseKey(PriorityQueueNode<T> *node, T newKey) = 0;

    virtual T deleteMin() = 0;
    virtual void deleteNode(PriorityQueueNode<T> *node) = 0;
    virtual std::string dotString() const { return ""; }

    const std::string &getName() const { return name; }

  protected:
    const std::string name;
  };
}

#endif //PRIORITYQUEUE_H
